
// JSON : JavaScript Object Notation
// 使用 JSON 格式 声明一个 对象(instance-level)
// 实际上是隐式创建了一个 Object对象(class-level) 的 实例(instance)
// 同时为该实例设置好了一批 属性 ( "名称-值" 对 )
let s = {
    id: 1001,
    name: '张君宝',
    gender: '男',
    age: 18,
    introduce: function(){
        console.log( '在下' + this.name +',' + this.gender + ',' + this.age + '岁' );
    }
}

console.log( s.id , s.name , s.gender , s.age );
s.introduce();

// 因为 用 JSON 声明的 对象 是 实例对象，不是构造函数，因此不可再创建实例
// let x = new s(); // TypeError: s is not a constructor

console.log( '- - - - - - - - - - - - - - - -' );

// 几乎所有的实例(instance)都可以通过constructor属性获得该实例的创建者
const c = s.constructor ; // 使用哪个构造函数创建了s引用的实例就返回哪个构造函数
console.log( c === Object );
// 在获得实例(instance)的创建者之后，即可通过该构造函数来获得相应的原型
const p = c.prototype ; // s.constructor.prototype
console.log( p === Object.prototype );

console.log( '- - - - - - - - - - - - - - - -' );

// 另外可以通过 "引用变量名.__proto__" 形式直接获得 实例(instance)对应的对象(class-level)的原型
console.log( s.__proto__ === Object.prototype );
console.log( s.__proto__ === s.constructor.prototype );

// 但是 __proto__ 属性不是标准属性，只某些特定环境下可以使用，因此反对使用
// 目前现代浏览器中都支持使用 __proto__ 属性来获得 实例(instance)对应的对象(class-level)的原型
// 建议使用 Object.getPrototypeOf( instanceRef ) 来替代 instanceRef.__proto__
let proto = Object.getPrototypeOf( s );
console.log( proto );
console.log( proto === Object.prototype ); // true